package com.tsy.server.system.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tsy.server.common.PageResult;
import com.tsy.server.common.Result;
import com.tsy.server.common.group.CreateGroup;
import com.tsy.server.common.group.UpdateGroup;
import com.tsy.server.system.entity.User;
import com.tsy.server.system.entity.dto.UpdatePasswordDTO;
import com.tsy.server.system.entity.dto.UserOrganizationDTO;
import com.tsy.server.system.entity.dto.UserOrganizationListDTO;
import com.tsy.server.system.entity.vo.RolePermissionVO;
import com.tsy.server.system.entity.vo.UserInfoVO;
import com.tsy.server.system.entity.vo.UserListVO;
import com.tsy.server.system.entity.vo.UserVO;
import com.tsy.server.system.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.groups.Default;

/**
 * 用户信息控制器
 */
@Api(tags = "用户信息接口", description = "包含用户查询、禁用等功能")
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 获取当前登录用户信息
     *
     * @return 用户信息
     */
    @ApiOperation(value = "当前登录用户信息", notes = "获取当前登录用户的详细信息，需要在请求头中携带token")
    @GetMapping("/info")
    public Result<UserInfoVO> getUserInfo() {
        UserInfoVO userInfoVO = userService.getCurrentUserInfo();
        return Result.success(userInfoVO);
    }

    /**
     * 获取用户列表
     * @param userVO 查询参数
     * @return 用户列表
     */
    @GetMapping("/users")
    @ApiOperation(value = "用户列表", notes = "分页获取用户列表信息")
//    @ApiImplicitParams({
//        @ApiImplicitParam(name = "pageNum", value = "页码", required = true, dataType = "Integer", paramType = "query", example = "1"),
//        @ApiImplicitParam(name = "pageSize", value = "每页数量", required = true, dataType = "Integer", paramType = "query", example = "10")
//    })
    public Result<PageResult> listUsers(UserVO userVO) {
        Page<User> userPage = userService.listUsers(userVO);
        // 将User对象转换为UserInfoVO对象
//        List<UserInfoVO> userInfoVOS = userPage.getRecords().stream().map(user -> {
//            UserInfoVO userInfoVO = new UserInfoVO();
//            BeanUtils.copyProperties(user, userInfoVO);
//            return userInfoVO;
//        }).collect(Collectors.toList());
//        Page<UserInfoVO> userInfoPage = new Page<>();
//        BeanUtils.copyProperties(userPage, userInfoPage);
//        userInfoPage.setRecords(userInfoVOS);
        return PageResult.toPageResult(userPage, UserInfoVO.class);
    }

    /**
     * 组织用户列表
     * @param userVO 查询参数
     * @return 组织用户列表
     */
    @PreAuthorize("hasAuthority('admin')")
    @GetMapping("/orgUserList")
    @ApiOperation(value = "组织用户列表", notes = "分页获取组织用户列表信息")
    public Result<PageResult> orgUerList(UserVO userVO) {
        Page<UserListVO> userPage = userService.getOrgUserList(userVO);
        return PageResult.toPageResult(userPage);
    }

    /**
     * 用户名查询用户是否存在
     */
    @GetMapping("/existByUsername/{username}")
    @ApiOperation(value = "用户名查询用户是否存在", notes = "用户名查询用户是否存在")
    public Result<Boolean> existByUsername(@PathVariable String username) {
        return Result.success(userService.getUserByUsername(username) != null);
    }

    /**
     * 批量添加组织人员
     */
    @PreAuthorize("hasAuthority('admin')")
    @PostMapping("/batchAddOrgUser")
    @ApiOperation(value = "批量添加组织人员", notes = "批量添加组织人员")
    public Result<Void> batchAddOrgUser( @Validated({Default.class, CreateGroup.class})
                                             @RequestBody UserOrganizationListDTO dto) {
        userService.batchAddOrgUser(dto.getUserOrgs());
        return Result.success();
    }

    /**
     * 删除组织用户
     * @param userId 组织用户ID
     */
    // hasAuthority 方法不会自动添加 ROLE_ 前缀  hasRole 方法会自动添加 ROLE_ 前缀
    @PreAuthorize("hasAuthority('admin')")
    @DeleteMapping("/delOrgUser/{userId}")
    @ApiOperation(value = "删除组织用户", notes = "删除组织用户")
    public Result<Void> delOrgUser(@PathVariable Long userId) {
        userService.delOrgUser(userId);
        return Result.success();
    }

    /**
     * 修改组织用户信息
     */
    @PreAuthorize("hasAuthority('admin')")
    @PutMapping("/updateOrgUser")
    @ApiOperation(value = "修改组织用户信息", notes = "修改组织用户信息")
    public Result<Void> updateOrgUser(@Validated({Default.class, UpdateGroup.class}) @RequestBody UserOrganizationDTO userOrganizationDTO) {
        userService.updateOrgUser(userOrganizationDTO);
        return Result.success();
    }

    /**
     * 切换当前组织
     */
    @GetMapping("/switchOrg/{currentOrgId}")
    @ApiOperation(value = "切换当前组织", notes = "切换当前组织")
    public Result<RolePermissionVO> switchOrg(@PathVariable Long currentOrgId) {
        RolePermissionVO rolePermissionVO = userService.switchOrg(currentOrgId);
        return Result.success(rolePermissionVO);
    }
    
    /**
     * 修改密码
     * 
     * @param updatePasswordDTO 修改密码信息
     * @return 操作结果
     */
    @PutMapping("/updatePwd")
    @ApiOperation(value = "修改密码", notes = "用户修改自己的密码，需要提供旧密码、新密码和确认密码")
    public Result<Void> updatePassword(@Validated @RequestBody UpdatePasswordDTO updatePasswordDTO) {
        userService.updatePassword(updatePasswordDTO);
        return Result.success("密码修改成功");
    }

}
